-- 初始化返回值
local trigger_result = 0      -- 触发结果：0-未触发限制，1-触发限制
local trigger_call_Stat = 0   -- 触发统计类型：0-未触发，1-基础规则，2-深度规则
local api_count = 0           -- API调用次数
local threshold = 0           -- 阈值
local message_index = -1      -- 消息索引（用于深度规则）

-- 解析传入的JSON参数
local apiRule = cjson.decode(KEYS[1])
local api_rule_type = apiRule.apiRuleType        -- 规则类型：1-基础规则，2-深度规则
local rule_key = apiRule.ruleKey                 -- 规则计数key
local rule_stat_time = apiRule.statTime          -- 统计时间
local rule_threshold = apiRule.threshold         -- 规则阈值
local rule_effective_time = apiRule.effectiveTime -- 规则生效时间
local rule_limit_key = apiRule.ruleLimitKey      -- 规则限制key
local z_set_key = apiRule.zSetRuleStatKey        -- 规则统计zset key
local current_Time = apiRule.currentTime         -- 当前时间戳

-- 基础规则处理
-- 递增计数器并设置过期时间
local count = tonumber(redis.call('incrby', rule_key, 1))
if (count == 1) then
    redis.call('expire', rule_key, rule_stat_time)
end

-- 检查是否超过阈值
if ((count - rule_threshold) >= 0) then
    -- 如果限制key不存在，创建限制标记
    if (redis.call('exists', rule_limit_key) == 0) then
        redis.call('set', rule_limit_key, rule_limit_key)
        redis.call('expire', rule_limit_key, rule_effective_time)
        trigger_call_Stat = 1  -- 标记为基础规则触发
        -- 记录触发事件到zset
        local z_set_member = current_Time .. "_" .. tostring(count)
        redis.call('zadd', z_set_key, current_Time, z_set_member)
    end
    trigger_result = 1  -- 标记触发限制
end

-- 如果限制key存在，表示当前处于限制期
if (redis.call('exists', rule_limit_key) == 1) then
    trigger_result = 1
end

api_count = count
threshold = rule_threshold

-- 深度规则处理
if (api_rule_type == 2) then
    local depthRules = apiRule.depthRules
    -- 遍历所有深度规则
    for index, depth_rule in ipairs(depthRules) do
        local start_time_window = depth_rule.startTimeWindowTimestamp  -- 时间窗口开始时间
        local end_time_window = depth_rule.endTimeWindowTimestamp      -- 时间窗口结束时间
        local depth_rule_stat_time = depth_rule.statTime              -- 深度规则统计时间
        local depth_rule_threshold = depth_rule.threshold             -- 深度规则阈值
        local depth_rule_effective_time = depth_rule.effectiveTime    -- 深度规则生效时间
        local depth_rule_limit_key = depth_rule.depthRuleLimit       -- 深度规则限制key

        threshold = depth_rule_threshold

        -- 清理过期数据
        if (current_Time > start_time_window) then
            redis.call('zremrangebyscore', z_set_key, 0, start_time_window - 1000)
        end

        -- 在时间窗口内进行检查
        if (current_Time >= start_time_window and current_Time <= end_time_window) then
            -- 计算统计时间范围
            local z_set_min_score = start_time_window
            local z_set_max_score = current_Time
            if ((current_Time - start_time_window) > depth_rule_stat_time * 1000) then
                z_set_min_score = current_Time - (depth_rule_stat_time * 1000)
            end

            -- 统计时间范围内的触发次数
            local rule_trigger_count = tonumber(redis.call('zcount', z_set_key, z_set_min_score, z_set_max_score))
            api_count = rule_trigger_count

            -- 检查是否超过深度规则阈值
            if ((rule_trigger_count - depth_rule_threshold) >= 0) then
                -- 如果深度规则限制key不存在，创建限制标记
                if (redis.call('exists', depth_rule_limit_key) == 0) then
                    redis.call('set', depth_rule_limit_key, depth_rule_limit_key)
                    redis.call('expire', depth_rule_limit_key, depth_rule_effective_time)
                    trigger_result = 1
                    trigger_call_Stat = 2  -- 标记为深度规则触发
                    message_index = index
                    -- 立即返回结果
                    return string.format('{"triggerResult": %d, "triggerCallStat": %d, "apiCount": %d, "threshold": %d, "messageIndex": %d}',
                            trigger_result, trigger_call_Stat, api_count, threshold, message_index)
                end
            end

            -- 如果深度规则限制key存在，表示当前处于深度规则限制期
            if (redis.call('exists', depth_rule_limit_key) == 1) then
                trigger_result = 1
                message_index = index
                -- 立即返回结果
                return string.format('{"triggerResult": %d, "triggerCallStat": %d, "apiCount": %d, "threshold": %d, "messageIndex": %d}',
                        trigger_result, trigger_call_Stat, api_count, threshold, message_index)
            end
        end
    end
end

-- 返回最终结果
return string.format('{"triggerResult": %d, "triggerCallStat": %d, "apiCount": %d, "threshold": %d, "messageIndex": %d}',
        trigger_result, trigger_call_Stat, api_count, threshold, message_index)